package net.hserver.custom.server.dispatcher;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import net.hserver.custom.protocol.SmartCarDecoder;
import net.hserver.custom.protocol.SmartCarEncoder;
import net.hserver.custom.server.handler.SmartCarHandler;
import cn.hserver.core.interfaces.ProtocolDispatcherAdapter;
import cn.hserver.core.ioc.annotation.Bean;
import cn.hserver.core.ioc.annotation.Order;

//为啥Order是6 不是1 默认协议 用了2-5，1还没有用，通常自定义协议如果不是访问量高得都建议放在最后减少访问判断。访问高得就可以放在1 以来就被触发。
//注意 这里不能阻塞，不要求性能当然也没有关系。
@Order(6)
@Bean
public class SmartCarProtocolDispatcher implements ProtocolDispatcherAdapter {

    public static final int HEAD_DATA = 99999;

    @Override
    public boolean dispatcher(ChannelHandlerContext channelHandlerContext, ChannelPipeline channelPipeline, byte[] bytes) {
        //判断协议头是否是99999 如果是就走自定义得协议，逻辑和netty一样
        if (bytes.length > 4 && toInt(new byte[]{bytes[0], bytes[1], bytes[2], bytes[3]}) == HEAD_DATA) {
            channelPipeline.addLast(new SmartCarEncoder());
            channelPipeline.addLast(new SmartCarDecoder());
            channelPipeline.addLast(new SmartCarHandler());
            return true;
        } else {
            return false;
        }
    }

    public static int toInt(byte[] b) {
        int res = 0;
        for(int i=0;i<b.length;i++){
            res += (b[i] & 0xff) << ((3-i)*8);
        }
        return res;
    }

}
